#define _CRT_SECURE_NO_WARNINGS 1

//#include<bits/stdc++.h>
//
//using namespace std;
//
//int main()
//{
//	string s1, s2;
//	while (cin >> s1 >> s2)
//	{
//		int hash[26] = { 0 };
//		for (auto ch : s1)
//		{
//			hash[ch-'A']++;
//		}
//		bool flag = true;
//		for (auto ch : s2)
//		{
//			if (--hash[ch - 'A'] < 0)
//			{
//				flag = false;
//				break;
//			}
//		}
//
//		if(flag)
//			cout << "Yes" << endl;
//		else
//			cout << "No" << endl;
//	}
//
//	return 0;
//}




//#include<bits/stdc++.h>
//
//using namespace std;
//
//int main()
//{
//	long long arr[300010];
//	long long count = 0;
//	int n;
//	cin >> n;
//	for (int i = 0; i < 3 * n; i++)
//		cin >> arr[i];
//	sort(arr, arr + 3 * n);
//	for (int i = n; i < 3 * n; i+=2)
//	{
//		count += arr[i];
//	}
//
//	cout << count << endl;
//
//	return 0;
//}



//#include<bits/stdc++.h>
//
//using namespace std;
//
//long long arr[10010] = { 0 };
//
//int main()
//{
//	int n;
//	cin >> n;
//	int t;
//	while (n--)
//	{
//		cin >> t;
//		arr[t] += t;
//	}
//
//	long long f[10010] = { 0 };
//	long long g[10010] = { 0 };
//
//	f[0] = 0;
//	g[0] = 0;
//
//	for (int i = 1; i <= 10000; i++)
//	{
//		f[i] = arr[i] + g[i - 1];
//		g[i] = max(g[i - 1], f[i - 1]);
//	}
//
//	if (f[10000] > g[10000])
//		cout << f[10000] << endl;
//	else
//		cout << g[10000] << endl;
//
//	return 0;
//}

//
//#include<bits/stdc++.h>
//
//using namespace std;
//
//int main()
//{
//	long long n;
//	cin >> n;
//	long long k = sqrt(n);
//	if (abs(k * k - n) < abs(((k + 1) * (k + 1)) - n))
//		cout << k*k;
//	else
//		cout << (k + 1) * (k + 1);
//
//	return 0;
//}



#include<bits/stdc++.h>
#include<unordered_map>

using namespace std;

unordered_map<int, int> cnt;
int n, m, t;

bool check(int x)
{
	int g = 0;
	for (auto& [a, b] : cnt)
	{
		g += (b / x) + (b % x == 0 ? 0 : 1);
	}
	return g <= m;
}

int main()
{
	int arr[100010] = { 0 };
	int hmax = 0;
	cin >> n >> m;
	for (int i = 0; i < n; i++)
	{
		cin >> t;
		cnt[t]++;
		hmax = max(hmax, cnt[t]);
	}

	if (cnt.size() > m)
		cout << -1 << endl;
	else
	{
		//for (int i = 1; i <= hmax; i++)
		//{
		//	if (check(i))
		//	{
		//		cout << i << endl;
		//		break;
		//	}
		//}


		int l = 1, r = hmax;
		while (l < r)
		{
			int mid = (l + r) / 2;
			if (check(mid)) 
				r = mid;
			else
				l = mid + 1;
		}

		cout << l;
	}


	return 0;
}